/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.tewi.annotations.processors;

import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.tewi.contexts.ApplicationServerContext;
import pl.tewi.annotations.AppResource;
import pl.tewi.annotations.ApplicationServer;
import pl.tewi.exceptions.AnnotationProcessingException;
import pl.tewi.exceptions.FileOrDirectoryException;
import pl.tewi.exceptions.IncorrectFilePath;
import pl.tewi.exceptions.UseAppResourceAnnotationException;
import pl.tewi.utils.FileUtils;

/**
 * Klasa odpowiedziala za przetworzenie adnotacji (@link AppResource}
 * @author Marcin Kwapisz
 */
public class AppResourceAnnotationProcessor implements AnnotationProcessor {

    private static final Logger LOGGER = LoggerFactory.getLogger(AppResourceAnnotationProcessor.class.getName());

    /**
     * Ścieżka w adanotacji powinna być relatywna względem projekt 
     * baza ustawiana jest przez {@link RunWithAnnotationProcessor}
     * @param klass klasa opisana przetwarzaną adnotacją
     * @param context kontekst serwera aplikacji do uzupełnienia (nie może być null)
     * @return uzupełniony kontekst serwera aplikacji
     * @throws FileDoesNotExistsException plik zasobów nie istnieje
     * @throws IncorrectFilePath nieprawidłowa ścieżka do pliku zasobów
     */
    @Override
    public ApplicationServerContext processAnnotations(final Class<?> klass, final ApplicationServerContext context) throws AnnotationProcessingException {
        ApplicationServer applicationServer = klass.getAnnotation(ApplicationServer.class);
        AppResource appResource = applicationServer.resources();
        //sprawdź czy pliki podany w adnotacji istnieją
        if (appResource != null) {
            String absolutePath;
            for (String resourcesPath : appResource.value()) {
                try {
                    absolutePath = FileUtils.joinPaths(context.getProjectPath(), resourcesPath);
                } catch (IOException ex) {
                    throw new IncorrectFilePath(IncorrectFilePath.MALFORMED_PATH, ex);
                }
                if (FileUtils.isFileExists(absolutePath)) {
                    LOGGER.debug("Adding resource file {}", absolutePath);
                    context.addResourceFile(absolutePath);
                } else {
                    throw new FileOrDirectoryException(absolutePath);
                }
            }
        } else {
            throw new UseAppResourceAnnotationException();
        }
        
        return context;
    }
}
